package com.example.learningnote;

import android.content.ComponentName;
import android.content.Context;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Button;
import android.widget.TextView;
import android.content.Intent;

import androidx.appcompat.app.AppCompatActivity;

import com.example.learningnote.receivers.BatteryReceiver;
import com.example.learningnote.receivers.DownloadReceiver;
import com.example.learningnote.services.FileDownloadService;
import com.example.learningnote.services.LocationService;


// Service Android 四大组件之一，用于在后台执行长时间运行的操作或处理无需用户界面的任务。运行在主线程中，因此耗时操作需在子线程中完成。Service 不提供用户界面，但可以与其他组件（如 Activity）通信。
// Started Service（启动服务）：由其他组件通过 startService() 调用，运行直到显式停止（stopService() 或 stopSelf()）。
// Bound Service（绑定服务）：通过 bindService() 绑定，允许客户端（如 Activity）与其交互，生命周期依赖于绑定者。
// Started Service：音乐播放器后台播放音乐、下载文件、定时同步数据。
// Bound Service：实时获取 GPS 位置、跨进程通信（如与远程服务的交互）。

// 案例说明
// Started Service（后台文件下载服务）
// Bound Service（实时 GPS 位置跟踪）
// 应用场景：一个文件管理应用需要从服务器下载大文件（如 PDF 或视频）。用户点击“下载”按钮后，下载任务在后台运行，即使应用退出或设备屏幕关闭，下载仍继续。下载完成后，通过通知告知用户。
// 下载任务是独立的后台操作，不需要与 Activity 实时交互。
// 服务需长时间运行，且不受 Activity 生命周期影响。
// 需要在下载完成时发送通知，符合 Started Service 的特性。

// 应用场景：一个跑步记录应用需要实时获取用户的 GPS 位置，并在 Activity 中显示当前的经纬度和移动距离。用户打开应用时，Activity 绑定到 Service，获取位置数据；关闭应用时，解绑并停止位置跟踪。
// Activity 需要与 Service 实时交互，获取最新的位置数据。
// 服务仅在 Activity 绑定时运行，节省资源。
// 客户端-服务器模型适合这种动态数据交换。





public class ServicesActivity extends AppCompatActivity implements BatteryReceiver.BatteryLevelListener {
    private LocationService locationService;
    private boolean isBound = false;
    private TextView locationText;
    private TextView distanceText;
    private TextView batteryTextView;
    private BatteryReceiver batteryReceiver;
    private IntentFilter intentFilter;
    private DownloadReceiver downloadReceiver;
    private TextView statusTextView;


    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            LocationService.LocalBinder binder = (LocationService.LocalBinder) service;
            locationService = binder.getService();
            isBound = true;
            locationText.setText("Location: Connected");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBound = false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_services);

        locationText = findViewById(R.id.service_location_text);
        distanceText = findViewById(R.id.service_distance_text);
        Button updateButton = findViewById(R.id.service_update_btn);



        Button downloadButton = findViewById(R.id.service_down_btn);
        downloadButton.setOnClickListener(v -> {
            Intent intent = new Intent(this, FileDownloadService.class);
            intent.putExtra("file_url", "https://image.baidu.com/search/detail?adpicid=0&bdtype=0&commodity=&copyright=&cs=1466601549%2C1453190296&di=7482437761027276801&fr=click-pic&fromurl=http%253A%252F%252Fbaike.baidu.com%252Fitem%252F%2525E7%252599%2525BE%2525E5%2525BA%2525A6%2525E7%25259B%252592%2525E5%2525AD%252590%252F13463824&gsm=1e&hd=&height=0&hot=&ic=&ie=utf-8&imgformat=&imgratio=&imgspn=0&is=0%2C0&isImgSet=&latest=&lid=11826445944594623117&lm=&objurl=https%253A%252F%252Fbkimg.cdn.bcebos.com%252Fpic%252Fb21bb051f819861841bb490948ed2e738ad4e6bb&os=2820679414%2C977237032&pd=image_content&pi=0&pn=1&rn=1&simid=1466601549%2C1453190296&tn=baiduimagedetail&width=0&word=%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&z=");
            startService(intent);
            statusTextView.setText("Status: Downloading...");
        });

        updateButton.setOnClickListener(v -> {
            if (isBound) {
                double lat = locationService.getLatitude();
                double lon = locationService.getLongitude();
                double distance = locationService.getDistance();
                locationText.setText(String.format("Location: (%.4f, %.4f)", lat, lon));
                distanceText.setText(String.format("Distance: %.2f m", distance));
            }
        });

        batteryTextView = findViewById(R.id.batteryTextView);
        batteryReceiver = new BatteryReceiver(this);
        intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

        statusTextView = findViewById(R.id.statusTextView);
        downloadReceiver = new DownloadReceiver(statusTextView);
        intentFilter = new IntentFilter(FileDownloadService.ACTION_DOWNLOAD_COMPLETE);

    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, LocationService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (isBound) {
            unbindService(connection);
            isBound = false;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(batteryReceiver, intentFilter);
        registerReceiver(downloadReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(batteryReceiver);
        unregisterReceiver(downloadReceiver);
    }


    @Override
    public void onBatteryLevelChanged(int level, boolean isLow) {
        batteryTextView.setText("Battery Level: " + level + "%" + (isLow ? " (Low)" : ""));
    }
}